package br.com.datasun.biblioteca.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import br.com.datasun.biblioteca.dao.factory.ConnectionFactory;
import br.com.datasun.biblioteca.entities.Emprestimo;
import br.com.datasun.biblioteca.entities.Exemplar;
import br.com.datasun.biblioteca.entities.Pessoa;
import br.com.datasun.biblioteca.entities.PessoaFisica;
import br.com.datasun.biblioteca.entities.Documento;
import br.com.datasun.biblioteca.entities.TipoDocumento;
import br.com.datasun.biblioteca.exceptions.DAOException;


public class EmprestimoDAO {
	
	public boolean inserirEmprestimo(Emprestimo emprestimo) throws DAOException{
		boolean result = true;
		
		Connection connection = null;
		PreparedStatement preparedStatement   = null;
		ResultSet resultSet   = null;
		StringBuilder sql = new StringBuilder();
		sql.append("insert into emprestimo ");
		sql.append("( dh_prevista_devolucao ");
		sql.append(" ,id_exemplar ");
		sql.append(" ,id_pessoa )");
		sql.append(" values ");
		sql.append("( ? ");
		sql.append(" ,? ");
		sql.append(" ,? )");
		
		try{
			connection = ConnectionFactory.createConnectionToMySQL();
			preparedStatement = connection.prepareStatement(sql.toString(), Statement.RETURN_GENERATED_KEYS);
			Exemplar exemplar = emprestimo.getExemplar();
			Pessoa pessoa = emprestimo.getPessoa();
			java.sql.Date sqlDtPrevistaDevolucao = new java.sql.Date(emprestimo.getDtPrevistaDevolucao().getTime());  
			preparedStatement.setDate(1, sqlDtPrevistaDevolucao);
			preparedStatement.setLong(2, exemplar.getId());
			preparedStatement.setLong(3, pessoa.getId());
			preparedStatement.execute();
			
		}catch (Exception e) {
			result = false;
			throw new DAOException(e);
		}finally{
			try{
				if(resultSet != null){
					resultSet.close();
				}
				if(preparedStatement != null){
					preparedStatement.close();
				}
				if(connection != null){
					connection.close();
				}
			}catch (Exception e) {
				throw new DAOException(e);
			}
		}
		
		return result;
	}
	
	public boolean atualizarEmprestimo(Emprestimo emprestimo) throws DAOException{
		boolean result = true;
		Connection connection = null;
		PreparedStatement preparedStatement   = null;
		ResultSet resultSet   = null;
		StringBuilder sql = new StringBuilder();
		sql.append("update emprestimo ");
		sql.append("   set dh_devolucao = ? ");
		sql.append(" where id = ? ");
		sql.append("   and dh_devolucao is null ");
		
		try{
			connection = ConnectionFactory.createConnectionToMySQL();			
			preparedStatement = connection.prepareStatement(sql.toString());
			preparedStatement.setDate(1, (Date)emprestimo.getDhDevolucao());
			preparedStatement.setLong(2, emprestimo.getId());
			preparedStatement.executeUpdate();
			result = true;
			
		}catch (Exception e) {
			result = false;
			throw new DAOException(e);
		}finally{
			try{
				if(resultSet != null){
					resultSet.close();
				}
				if(preparedStatement != null){
					preparedStatement.close();
				}
				if(connection != null){
					connection.close();
				}
			}catch (Exception e) {
				throw new DAOException(e);
			}
		}
		
		return result;
	}
	
	public Emprestimo getEmprestimoNaoDevolvidoPorExemplar(Exemplar exemplar)throws DAOException{
		Emprestimo result = null;
		Connection connection = null;
		PreparedStatement preparedStatement   = null;
		ResultSet resultSet   = null;
		StringBuilder sql = new StringBuilder();
		
		sql.append(" select e.id id_emprestimo ");
		sql.append("       ,e.dh_emprestimo ");
		sql.append("       ,e.dh_prevista_devolucao ");
		sql.append("       ,e.id_exemplar ");
		sql.append("       ,e.id_pessoa ");
		sql.append("       ,l.id id_livro ");
    	sql.append("       ,l.titulo titulo_livro ");
		sql.append("       ,l.isbn13 ");
		sql.append("       ,p.nome ");
		sql.append("       ,d.id id_documento");
		sql.append("       ,d.numero numero_documento ");
		sql.append("       ,d.id_tipo_documento ");
    	sql.append("   from emprestimo e ");
		sql.append("       ,exemplar ex ");
		sql.append("       ,livro l ");
		sql.append("       ,pessoa p ");
		sql.append("       ,documento d ");
		sql.append("  where e.id_exemplar = ex.id ");
		sql.append("    and ex.id_livro = l.id ");
	    sql.append("    and e.id_pessoa = p.id ");
		sql.append("    and d.id_pessoa = p.id ");
		sql.append("    and d.id_tipo_documento = 1 ");
		sql.append("    and e.id_exemplar = ? ");
		sql.append("    and e.dh_devolucao is null ");				
		try{
			connection = ConnectionFactory.createConnectionToMySQL();
			preparedStatement = connection.prepareStatement(sql.toString());
			preparedStatement.setLong(1, exemplar.getId());
			resultSet = preparedStatement.executeQuery();
			if (resultSet.next()) {
				Emprestimo emprestimo = new Emprestimo();
				emprestimo.setId(resultSet.getLong("id_emprestimo"));
				emprestimo.setDhEmprestimo(resultSet.getDate("dh_emprestimo"));
				emprestimo.setDtPrevistaDevolucao(resultSet.getDate("dh_prevista_devolucao"));
				emprestimo.setDhDevolucao(new Date(System.currentTimeMillis()));//Devolvendo Hoje

				emprestimo.setExemplar(exemplar);
				
				PessoaFisica pessoa = new PessoaFisica();
				pessoa.setNome(resultSet.getString("nome"));
				
				List<Documento> documentos = new ArrayList<Documento>();
				Documento cpf = new Documento();
				cpf.setId(resultSet.getLong("id_documento"));
				cpf.setNumero(resultSet.getString("numero_documento"));
				cpf.setTipoDocumento(TipoDocumento.getValueOf(resultSet.getLong("id_tipo_documento")));
				documentos.add(cpf);
				pessoa.setDocumentos(documentos);
				emprestimo.setPessoa(pessoa);
				
				result = emprestimo;
			}
		}catch (Exception e) {
			throw new DAOException(e);
		}finally{
			try{
				if(resultSet != null){
					resultSet.close();
				}
				if(preparedStatement != null){
					preparedStatement.close();
				}
				if(connection != null){
					connection.close();
				}
			}catch (Exception e) {
				throw new DAOException(e);
			}
		}
		return result;
	}

}
